#include <iostream>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void handler(int signo) {
    std::cout << "begin to with subprocess" << std::endl;
    // 同时可能多个子进程同时退出，使用循环进行等待
    while (true) {
        pid_t rid = waitpid(-1, nullptr, WNOHANG);
        if (rid > 0) {
            std::cout << "wait success, pid: " << rid << std::endl;
        }
        else if (rid < 0) {
            // 全部都等待成功
            std::cout << "wait done" << std::endl;
            break;            
        } 
        else {
            // 局部方式已经等待成功
            std::cout << "wait done" << std::endl;
            break;     
        }
    }
}

int main() {
    // 可以直接忽略SIGCHLD信号
    // signal(SIGCHLD, SIG_IGN);
    signal(SIGCHLD, handler);
    for (int i = 0; i < 10; i++) {
        pid_t id = fork();
        if (id == 0) {
            sleep(2);
            exit(0);
        }
    }
    while (true) {
        std::cout << "I am father process" << std::endl;
        sleep(1);
    }
    return 0;
}